{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Predicting Titanic Survival\n",
    "\n",
    "From the description of a Kaggle Machine Learning Challenge at https://www.kaggle.com/c/titanic\n",
    "\n",
    "> The sinking of the RMS Titanic is one of the most infamous shipwrecks in history.  On April 15, 1912, during her maiden voyage, the Titanic sank after colliding with an iceberg, killing 1502 out of 2224 passengers and crew. This sensational tragedy shocked the international community and led to better safety regulations for ships.\n",
    "\n",
    ">One of the reasons that the shipwreck led to such loss of life was that there were not enough lifeboats for the passengers and crew. Although there was some element of luck involved in surviving the sinking, some groups of people were more likely to survive than others, such as women, children, and the upper-class.\n",
    "\n",
    "> In this challenge, we ask you to complete the analysis of what sorts of people were likely to survive. In particular, we ask you to apply the tools of machine learning to predict which passengers survived the tragedy. \n",
    "\n",
    "In this demo we will use MLDB to train a classifier to predict whether a passenger would have survived the Titanic disaster."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Initializing `pymldb` and other imports\n",
    "\n",
    "In this demo, we will use `pymldb` to interact with the [REST API](../../../../doc/#builtin/WorkingWithRest.md.html): see the [Using `pymldb` Tutorial](../../../../doc/nblink.html#_tutorials/Using pymldb Tutorial) for more details."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "from pymldb import Connection\n",
    "mldb = Connection(\"http://localhost\")\n",
    "\n",
    "#we'll need these also later!\n",
    "import numpy as np\n",
    "import pandas as pd, matplotlib.pyplot as plt, seaborn, ipywidgets\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Checking out the Titanic dataset\n",
    "\n",
    "From https://www.kaggle.com/c/titanic"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Load up the data\n",
    "\n",
    "See the [Loading Data Tutorial](../../../../doc/nblink.html#_tutorials/Loading Data Tutorial) guide for more details on how to get data into MLDB."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<strong>PUT http://localhost/v1/procedures/import_titanic_raw</strong><br /><strong style=\"color: green;\">201 Created</strong><br /> <div class=\"highlight\"><pre style=\"line-height: 125%\"><span></span>{\n",
       "  <span style=\"color: #333333; font-weight: bold\">&quot;status&quot;</span>: {\n",
       "    <span style=\"color: #333333; font-weight: bold\">&quot;firstRun&quot;</span>: {\n",
       "      <span style=\"color: #333333; font-weight: bold\">&quot;runStarted&quot;</span>: <span style=\"color: #0000dd\">&quot;2016-12-16T15:50:08.7610252Z&quot;</span>, \n",
       "      <span style=\"color: #333333; font-weight: bold\">&quot;status&quot;</span>: {\n",
       "        <span style=\"color: #333333; font-weight: bold\">&quot;numLineErrors&quot;</span>: <span style=\"color: #0000dd\">0</span>\n",
       "      }, \n",
       "      <span style=\"color: #333333; font-weight: bold\">&quot;runFinished&quot;</span>: <span style=\"color: #0000dd\">&quot;2016-12-16T15:50:08.804541Z&quot;</span>, \n",
       "      <span style=\"color: #333333; font-weight: bold\">&quot;id&quot;</span>: <span style=\"color: #0000dd\">&quot;2016-12-16T15:50:08.760858Z-463496b56263af05&quot;</span>, \n",
       "      <span style=\"color: #333333; font-weight: bold\">&quot;state&quot;</span>: <span style=\"color: #0000dd\">&quot;finished&quot;</span>\n",
       "    }\n",
       "  }, \n",
       "  <span style=\"color: #333333; font-weight: bold\">&quot;config&quot;</span>: {\n",
       "    <span style=\"color: #333333; font-weight: bold\">&quot;params&quot;</span>: {\n",
       "      <span style=\"color: #333333; font-weight: bold\">&quot;outputDataset&quot;</span>: <span style=\"color: #0000dd\">&quot;titanic_raw&quot;</span>, \n",
       "      <span style=\"color: #333333; font-weight: bold\">&quot;runOnCreation&quot;</span>: <span style=\"color: #0000dd\">true</span>, \n",
       "      <span style=\"color: #333333; font-weight: bold\">&quot;dataFileUrl&quot;</span>: <span style=\"color: #0000dd\">&quot;http://public.mldb.ai/titanic_train.csv&quot;</span>\n",
       "    }, \n",
       "    <span style=\"color: #333333; font-weight: bold\">&quot;type&quot;</span>: <span style=\"color: #0000dd\">&quot;import.text&quot;</span>, \n",
       "    <span style=\"color: #333333; font-weight: bold\">&quot;id&quot;</span>: <span style=\"color: #0000dd\">&quot;import_titanic_raw&quot;</span>\n",
       "  }, \n",
       "  <span style=\"color: #333333; font-weight: bold\">&quot;state&quot;</span>: <span style=\"color: #0000dd\">&quot;ok&quot;</span>, \n",
       "  <span style=\"color: #333333; font-weight: bold\">&quot;type&quot;</span>: <span style=\"color: #0000dd\">&quot;import.text&quot;</span>, \n",
       "  <span style=\"color: #333333; font-weight: bold\">&quot;id&quot;</span>: <span style=\"color: #0000dd\">&quot;import_titanic_raw&quot;</span>\n",
       "}\n",
       "</pre></div>\n"
      ],
      "text/plain": [
       "<Response [201]>"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mldb.put('/v1/procedures/import_titanic_raw', { \n",
    "    \"type\": \"import.text\",\n",
    "    \"params\": { \n",
    "        \"dataFileUrl\": \"http://public.mldb.ai/titanic_train.csv\",\n",
    "        \"outputDataset\": \"titanic_raw\",\n",
    "        \"runOnCreation\": True\n",
    "    } \n",
    "})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Let's look at the data\n",
    "\n",
    "See the [Query API](../../../../doc/#builtin/sql/QueryAPI.md.html) documentation for more details on SQL queries."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Age</th>\n",
       "      <th>Embarked</th>\n",
       "      <th>Fare</th>\n",
       "      <th>Name</th>\n",
       "      <th>Parch</th>\n",
       "      <th>PassengerId</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Sex</th>\n",
       "      <th>SibSp</th>\n",
       "      <th>Ticket</th>\n",
       "      <th>label</th>\n",
       "      <th>Cabin</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>_rowName</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>22</td>\n",
       "      <td>S</td>\n",
       "      <td>7.2500</td>\n",
       "      <td>BraundMr.OwenHarris</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>male</td>\n",
       "      <td>1</td>\n",
       "      <td>A/521171</td>\n",
       "      <td>0</td>\n",
       "      <td>None</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>38</td>\n",
       "      <td>C</td>\n",
       "      <td>71.2833</td>\n",
       "      <td>CumingsMrs.JohnBradley(FlorenceBriggsThayer)</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>female</td>\n",
       "      <td>1</td>\n",
       "      <td>PC17599</td>\n",
       "      <td>1</td>\n",
       "      <td>C85</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>26</td>\n",
       "      <td>S</td>\n",
       "      <td>7.9250</td>\n",
       "      <td>HeikkinenMiss.Laina</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>female</td>\n",
       "      <td>0</td>\n",
       "      <td>STON/O2.3101282</td>\n",
       "      <td>1</td>\n",
       "      <td>None</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>35</td>\n",
       "      <td>S</td>\n",
       "      <td>53.1000</td>\n",
       "      <td>FutrelleMrs.JacquesHeath(LilyMayPeel)</td>\n",
       "      <td>0</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>female</td>\n",
       "      <td>1</td>\n",
       "      <td>113803</td>\n",
       "      <td>1</td>\n",
       "      <td>C123</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>35</td>\n",
       "      <td>S</td>\n",
       "      <td>8.0500</td>\n",
       "      <td>AllenMr.WilliamHenry</td>\n",
       "      <td>0</td>\n",
       "      <td>5</td>\n",
       "      <td>3</td>\n",
       "      <td>male</td>\n",
       "      <td>0</td>\n",
       "      <td>373450</td>\n",
       "      <td>0</td>\n",
       "      <td>None</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          Age Embarked     Fare                                          Name  \\\n",
       "_rowName                                                                        \n",
       "2          22        S   7.2500                           BraundMr.OwenHarris   \n",
       "3          38        C  71.2833  CumingsMrs.JohnBradley(FlorenceBriggsThayer)   \n",
       "4          26        S   7.9250                           HeikkinenMiss.Laina   \n",
       "5          35        S  53.1000         FutrelleMrs.JacquesHeath(LilyMayPeel)   \n",
       "6          35        S   8.0500                          AllenMr.WilliamHenry   \n",
       "\n",
       "          Parch  PassengerId  Pclass     Sex  SibSp           Ticket  label  \\\n",
       "_rowName                                                                      \n",
       "2             0            1       3    male      1         A/521171      0   \n",
       "3             0            2       1  female      1          PC17599      1   \n",
       "4             0            3       3  female      0  STON/O2.3101282      1   \n",
       "5             0            4       1  female      1           113803      1   \n",
       "6             0            5       3    male      0           373450      0   \n",
       "\n",
       "         Cabin  \n",
       "_rowName        \n",
       "2         None  \n",
       "3          C85  \n",
       "4         None  \n",
       "5         C123  \n",
       "6         None  "
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mldb.query(\"select * from titanic_raw limit 5\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As a first step in the modelling process, it is often very useful to look at summary statistics to get a sense of the data. To do so, we will create a [Procedure](../../../../doc/#builtin/procedures/Procedures.md.html) of type [`summary.statistics`](../../../../doc/#builtin/procedures/SummaryStatisticsProcedure.md.html) and store the results in a new dataset called `titanic_summary_stats`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<Response [201]>\n"
     ]
    }
   ],
   "source": [
    "print mldb.post(\"/v1/procedures\", {\n",
    "    \"type\": \"summary.statistics\",\n",
    "    \"params\": {\n",
    "        \"inputData\": \"SELECT * FROM titanic_raw\",\n",
    "        \"outputDataset\": \"titanic_summary_stats\",\n",
    "        \"runOnCreation\": True\n",
    "    }\n",
    "})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can take a look at numerical columns:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>_rowName</th>\n",
       "      <th>Fare</th>\n",
       "      <th>SibSp</th>\n",
       "      <th>PassengerId</th>\n",
       "      <th>label</th>\n",
       "      <th>Age</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Parch</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>value.1st_quartile</th>\n",
       "      <td>7.8958</td>\n",
       "      <td>0</td>\n",
       "      <td>223</td>\n",
       "      <td>0</td>\n",
       "      <td>20</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>value.3rd_quartile</th>\n",
       "      <td>31</td>\n",
       "      <td>1</td>\n",
       "      <td>669</td>\n",
       "      <td>1</td>\n",
       "      <td>38</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>value.avg</th>\n",
       "      <td>32.2042</td>\n",
       "      <td>0.523008</td>\n",
       "      <td>446</td>\n",
       "      <td>0.383838</td>\n",
       "      <td>29.6991</td>\n",
       "      <td>2.30864</td>\n",
       "      <td>0.381594</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>value.data_type</th>\n",
       "      <td>number</td>\n",
       "      <td>number</td>\n",
       "      <td>number</td>\n",
       "      <td>number</td>\n",
       "      <td>number</td>\n",
       "      <td>number</td>\n",
       "      <td>number</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>value.max</th>\n",
       "      <td>512.329</td>\n",
       "      <td>8</td>\n",
       "      <td>891</td>\n",
       "      <td>1</td>\n",
       "      <td>80</td>\n",
       "      <td>3</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>value.median</th>\n",
       "      <td>14.4542</td>\n",
       "      <td>0</td>\n",
       "      <td>446</td>\n",
       "      <td>0</td>\n",
       "      <td>28</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>value.min</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0.42</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>value.num_null</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>177</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>value.num_unique</th>\n",
       "      <td>248</td>\n",
       "      <td>7</td>\n",
       "      <td>891</td>\n",
       "      <td>2</td>\n",
       "      <td>88</td>\n",
       "      <td>3</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>value.stddev</th>\n",
       "      <td>49.6934</td>\n",
       "      <td>1.10274</td>\n",
       "      <td>257.354</td>\n",
       "      <td>0.486592</td>\n",
       "      <td>14.5265</td>\n",
       "      <td>0.836071</td>\n",
       "      <td>0.806057</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "_rowName               Fare     SibSp PassengerId     label      Age  \\\n",
       "value.1st_quartile   7.8958         0         223         0       20   \n",
       "value.3rd_quartile       31         1         669         1       38   \n",
       "value.avg           32.2042  0.523008         446  0.383838  29.6991   \n",
       "value.data_type      number    number      number    number   number   \n",
       "value.max           512.329         8         891         1       80   \n",
       "value.median        14.4542         0         446         0       28   \n",
       "value.min                 0         0           1         0     0.42   \n",
       "value.num_null            0         0           0         0      177   \n",
       "value.num_unique        248         7         891         2       88   \n",
       "value.stddev        49.6934   1.10274     257.354  0.486592  14.5265   \n",
       "\n",
       "_rowName              Pclass     Parch  \n",
       "value.1st_quartile         2         0  \n",
       "value.3rd_quartile         3         0  \n",
       "value.avg            2.30864  0.381594  \n",
       "value.data_type       number    number  \n",
       "value.max                  3         6  \n",
       "value.median               3         0  \n",
       "value.min                  1         0  \n",
       "value.num_null             0         0  \n",
       "value.num_unique           3         7  \n",
       "value.stddev        0.836071  0.806057  "
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mldb.query(\"\"\"\n",
    "    SELECT * EXCLUDING(value.most_frequent_items*) \n",
    "    FROM titanic_summary_stats \n",
    "    WHERE value.data_type='number'\n",
    "\"\"\").transpose()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Training a classifier\n",
    "\n",
    "\n",
    "We will create another [Procedure](../../../../doc/#builtin/procedures/Procedures.md.html) of type [`classifier.experiment`](../../../../doc/#builtin/procedures/ExperimentProcedure.md.html). The `configuration` parameter defines a Random Forest algorithm."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Area under ROC curve = 0.8311\n",
      "\n"
     ]
    }
   ],
   "source": [
    "result = mldb.put('/v1/procedures/titanic_train_scorer', {\n",
    "    \"type\": \"classifier.experiment\",\n",
    "    \"params\": {\n",
    "        \"experimentName\": \"titanic\",\n",
    "        \"inputData\": \"\"\"\n",
    "            select \n",
    "                {Sex, Age, Fare, Embarked, Parch, SibSp, Pclass} as features,\n",
    "                label\n",
    "            from titanic_raw\n",
    "        \"\"\",\n",
    "        \"configuration\": {\n",
    "            \"type\": \"bagging\",\n",
    "            \"num_bags\": 10,\n",
    "            \"validation_split\": 0,\n",
    "            \"weak_learner\": {\n",
    "                \"type\": \"decision_tree\",\n",
    "                \"max_depth\": 10,\n",
    "                \"random_feature_propn\": 0.3\n",
    "            }\n",
    "        },\n",
    "        \"kfold\": 3,\n",
    "        \"modelFileUrlPattern\": \"file://models/titanic.cls\",\n",
    "        \"keepArtifacts\": True,\n",
    "        \"outputAccuracyDataset\": True,\n",
    "        \"runOnCreation\": True\n",
    "    }\n",
    "})\n",
    "\n",
    "auc = np.mean([x[\"resultsTest\"][\"auc\"] for x in result.json()[\"status\"][\"firstRun\"][\"status\"][\"folds\"]])\n",
    "print \"\\nArea under ROC curve = %0.4f\\n\" % auc"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## We automatically get a REST API for predictions\n",
    "\n",
    "The procedure above created for us a [Function](../../../../doc/#builtin/functions/Functions.md.html) of type [`classifier`](../../../../doc/#builtin/functions/ClassifierApply.md.html)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<strong>GET http://localhost/v1/functions/titanic_scorer_0/application?input=%7B%22features%22%3A+%7B%22Fare%22%3A+50%2C+%22Embarked%22%3A+%22C%22%2C+%22Age%22%3A+40%2C+%22Parch%22%3A+4%2C+%22Pclass%22%3A+2%2C+%22Sex%22%3A+%22male%22%2C+%22SibSp%22%3A+4%7D%7D</strong><br /><strong style=\"color: green;\">200 OK</strong><br /> <div class=\"highlight\"><pre style=\"line-height: 125%\"><span></span>{\n",
       "  <span style=\"color: #333333; font-weight: bold\">&quot;output&quot;</span>: {\n",
       "    <span style=\"color: #333333; font-weight: bold\">&quot;score&quot;</span>: <span style=\"color: #0000dd\">0.2905334234237671</span>\n",
       "  }\n",
       "}\n",
       "</pre></div>\n"
      ],
      "text/plain": [
       "<Response [200]>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "@ipywidgets.interact\n",
    "def score( Age=[0,80],Embarked=[\"C\", \"Q\", \"S\"], Fare=[1,100], Parch=[0,8], Pclass=[1,3], \n",
    "            Sex=[\"male\", \"female\"], SibSp=[0,8]):\n",
    "    return mldb.get('/v1/functions/titanic_scorer_0/application', input={\"features\": locals()})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## What's in a score?\n",
    "\n",
    "Scores aren't probabilities, but they can be used to create binary classifiers by applying a cutoff threshold. MLDB's `classifier.experiment` procedure outputs a dataset which you can use to figure out where you want to set that threshold."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>accuracy</th>\n",
       "      <th>falseNegatives</th>\n",
       "      <th>falsePositiveRate</th>\n",
       "      <th>falsePositives</th>\n",
       "      <th>index</th>\n",
       "      <th>label</th>\n",
       "      <th>precision</th>\n",
       "      <th>recall</th>\n",
       "      <th>score</th>\n",
       "      <th>trueNegatives</th>\n",
       "      <th>truePositiveRate</th>\n",
       "      <th>truePositives</th>\n",
       "      <th>weight</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>_rowName</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>601</th>\n",
       "      <td>0.620072</td>\n",
       "      <td>106</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1.00</td>\n",
       "      <td>0.009346</td>\n",
       "      <td>0.781576</td>\n",
       "      <td>172</td>\n",
       "      <td>0.009346</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>558</th>\n",
       "      <td>0.623656</td>\n",
       "      <td>105</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1.00</td>\n",
       "      <td>0.018692</td>\n",
       "      <td>0.768337</td>\n",
       "      <td>172</td>\n",
       "      <td>0.018692</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>488</th>\n",
       "      <td>0.627240</td>\n",
       "      <td>104</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1.00</td>\n",
       "      <td>0.028037</td>\n",
       "      <td>0.741543</td>\n",
       "      <td>172</td>\n",
       "      <td>0.028037</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>700</th>\n",
       "      <td>0.623656</td>\n",
       "      <td>104</td>\n",
       "      <td>0.005814</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>0.75</td>\n",
       "      <td>0.028037</td>\n",
       "      <td>0.730499</td>\n",
       "      <td>171</td>\n",
       "      <td>0.028037</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>617</th>\n",
       "      <td>0.627240</td>\n",
       "      <td>103</td>\n",
       "      <td>0.005814</td>\n",
       "      <td>1</td>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "      <td>0.80</td>\n",
       "      <td>0.037383</td>\n",
       "      <td>0.730317</td>\n",
       "      <td>171</td>\n",
       "      <td>0.037383</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          accuracy  falseNegatives  falsePositiveRate  falsePositives  index  \\\n",
       "_rowName                                                                       \n",
       "601       0.620072             106           0.000000               0      1   \n",
       "558       0.623656             105           0.000000               0      2   \n",
       "488       0.627240             104           0.000000               0      3   \n",
       "700       0.623656             104           0.005814               1      4   \n",
       "617       0.627240             103           0.005814               1      5   \n",
       "\n",
       "          label  precision    recall     score  trueNegatives  \\\n",
       "_rowName                                                        \n",
       "601           1       1.00  0.009346  0.781576            172   \n",
       "558           1       1.00  0.018692  0.768337            172   \n",
       "488           1       1.00  0.028037  0.741543            172   \n",
       "700           0       0.75  0.028037  0.730499            171   \n",
       "617           1       0.80  0.037383  0.730317            171   \n",
       "\n",
       "          truePositiveRate  truePositives  weight  \n",
       "_rowName                                           \n",
       "601               0.009346              1       1  \n",
       "558               0.018692              2       1  \n",
       "488               0.028037              3       1  \n",
       "700               0.028037              3       1  \n",
       "617               0.037383              4       1  "
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_results = mldb.query(\"select * from titanic_results_0 order by score desc\")\n",
    "test_results.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here's an interactive way to graphically explore the tradeoffs between the True Positive Rate and the False Positive Rate, using what's called a ROC curve.\n",
    "\n",
    "NOTE: the interactive part of this demo only works if you're running this Notebook live, not if you're looking at a static copy on http://docs.mldb.ai. See the documentation for [Running MLDB](../../../../doc/#builtin/Running.md.html)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nrkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fa3c49f1850>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "@ipywidgets.interact\n",
    "def test_results_plot( threshold_index=[0,len(test_results)-1]):\n",
    "    row = test_results.iloc[threshold_index]\n",
    "    cols = [\"trueNegatives\",\"falsePositives\",\"falseNegatives\",\"truePositives\",]\n",
    "    f, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 5))\n",
    "    \n",
    "    test_results.plot(ax=ax1, x=\"falsePositiveRate\", y=\"truePositiveRate\", \n",
    "    legend=False, title=\"ROC Curve, threshold=%.4f\" % row.score).set_ylabel('truePositiveRate')\n",
    "    ax1.plot(row.falsePositiveRate, row.truePositiveRate, 'gs')\n",
    "    \n",
    "    ax2.pie(row[cols], labels=cols, autopct='%1.1f%%', startangle = 90,\n",
    "            colors=['lightskyblue','lightcoral','lightcoral', 'lightskyblue'])\n",
    "    ax2.axis('equal')\n",
    "    f.subplots_adjust(hspace=.75)\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## But what is the model doing under the hood?\n",
    "\n",
    "Let's create a function of type [`classifier.explain`](../../../../doc/#builtin/functions/ClassifierExplain.md.html) to help us understand what's happening here."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<strong>PUT http://localhost/v1/functions/titanic_explainer</strong><br /><strong style=\"color: green;\">201 Created</strong><br /> <div class=\"highlight\"><pre style=\"line-height: 125%\"><span></span>{\n",
       "  <span style=\"color: #333333; font-weight: bold\">&quot;status&quot;</span>: {\n",
       "    <span style=\"color: #333333; font-weight: bold\">&quot;mode&quot;</span>: <span style=\"color: #0000dd\">&quot;regression&quot;</span>, \n",
       "    <span style=\"color: #333333; font-weight: bold\">&quot;summary&quot;</span>: <span style=\"color: #0000dd\">&quot;COMMITTEE&quot;</span>\n",
       "  }, \n",
       "  <span style=\"color: #333333; font-weight: bold\">&quot;config&quot;</span>: {\n",
       "    <span style=\"color: #333333; font-weight: bold\">&quot;params&quot;</span>: {\n",
       "      <span style=\"color: #333333; font-weight: bold\">&quot;modelFileUrl&quot;</span>: <span style=\"color: #0000dd\">&quot;file://models/titanic.cls&quot;</span>\n",
       "    }, \n",
       "    <span style=\"color: #333333; font-weight: bold\">&quot;type&quot;</span>: <span style=\"color: #0000dd\">&quot;classifier.explain&quot;</span>, \n",
       "    <span style=\"color: #333333; font-weight: bold\">&quot;id&quot;</span>: <span style=\"color: #0000dd\">&quot;titanic_explainer&quot;</span>\n",
       "  }, \n",
       "  <span style=\"color: #333333; font-weight: bold\">&quot;state&quot;</span>: <span style=\"color: #0000dd\">&quot;ok&quot;</span>, \n",
       "  <span style=\"color: #333333; font-weight: bold\">&quot;type&quot;</span>: <span style=\"color: #0000dd\">&quot;classifier.explain&quot;</span>, \n",
       "  <span style=\"color: #333333; font-weight: bold\">&quot;id&quot;</span>: <span style=\"color: #0000dd\">&quot;titanic_explainer&quot;</span>\n",
       "}\n",
       "</pre></div>\n"
      ],
      "text/plain": [
       "<Response [201]>"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mldb.put('/v1/functions/titanic_explainer', { \n",
    "    \"id\": \"titanic_explainer\", \n",
    "    \"type\": \"classifier.explain\",\n",
    "    \"params\": { \"modelFileUrl\": \"file://models/titanic.cls\" }\n",
    "})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Exploring the impact of features for a single example\n",
    "\n",
    "NOTE: the interactive part of this demo only works if you're running this Notebook live, not if you're looking at a static copy on http://docs.mldb.ai. See the documentation for [Running MLDB](../../../../doc/#builtin/Running.md.html)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\noyRJkiSp0f8H5iF5slsvmD4AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fa3c26db110>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "@ipywidgets.interact\n",
    "def sliders( Age=[0,80],Embarked=[\"C\", \"Q\", \"S\"], Fare=[1,100], Parch=[0,8], Pclass=[1,3], \n",
    "            Sex=[\"male\", \"female\"], SibSp=[0,8]):\n",
    "    features = locals()\n",
    "    x = mldb.get('/v1/functions/titanic_explainer/application', input={\"features\": features, \"label\": 1}).json()[\"output\"]\n",
    "   \n",
    "    df = pd.DataFrame(\n",
    "        {\"%s=%s\" % (feat, str(features[feat])): val for (feat, (val, ts)) in x[\"explanation\"]}, \n",
    "        index=[\"val\"]).transpose().cumsum()\n",
    "    pd.DataFrame(\n",
    "        {\"cumulative score\": [x[\"bias\"]]+list(df.val)+[df.val[-1]]}, \n",
    "        index=['bias'] + list(df.index) + ['final']\n",
    "    ).plot(kind='line', drawstyle='steps-post', legend=False, figsize=(15, 5), \n",
    "           ylim=(-1, 1), title=\"Score = %.4f\" % df.val[-1]).set_ylabel('Cumulative Score')\n",
    "    \n",
    "    plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Summing up explanation values to get overall feature importance"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "When we sum up the explanation values in the context of the correct label, we can get an indication of how important each feature was to making a correct classification."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fa3c4a28bd0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "df = mldb.query(\"\"\"\n",
    "select label, sum(\n",
    "    titanic_explainer({\n",
    "        label: label, \n",
    "        features: {Sex, Age, Fare, Embarked, Parch, SibSp, Pclass}\n",
    "    })[explanation]\n",
    ") as *\n",
    "from titanic_raw group by label\n",
    "\"\"\")\n",
    "df.set_index(\"label\").transpose().plot(kind='bar', title=\"Feature Importance\", figsize=(15, 5))\n",
    "plt.xticks(rotation=0)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "## We can also load up a custom UI for this"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<strong>PUT http://localhost/v1/plugins/pytanic</strong><br /><strong style=\"color: green;\">201 Created</strong><br /> <div class=\"highlight\"><pre style=\"line-height: 125%\"><span></span>{\n",
       "  <span style=\"color: #333333; font-weight: bold\">&quot;config&quot;</span>: {\n",
       "    <span style=\"color: #333333; font-weight: bold\">&quot;params&quot;</span>: {\n",
       "      <span style=\"color: #333333; font-weight: bold\">&quot;address&quot;</span>: <span style=\"color: #0000dd\">&quot;git://github.com/datacratic/mldb-pytanic-plugin&quot;</span>\n",
       "    }, \n",
       "    <span style=\"color: #333333; font-weight: bold\">&quot;type&quot;</span>: <span style=\"color: #0000dd\">&quot;python&quot;</span>, \n",
       "    <span style=\"color: #333333; font-weight: bold\">&quot;id&quot;</span>: <span style=\"color: #0000dd\">&quot;pytanic&quot;</span>\n",
       "  }, \n",
       "  <span style=\"color: #333333; font-weight: bold\">&quot;state&quot;</span>: <span style=\"color: #0000dd\">&quot;ok&quot;</span>, \n",
       "  <span style=\"color: #333333; font-weight: bold\">&quot;type&quot;</span>: <span style=\"color: #0000dd\">&quot;python&quot;</span>, \n",
       "  <span style=\"color: #333333; font-weight: bold\">&quot;id&quot;</span>: <span style=\"color: #0000dd\">&quot;pytanic&quot;</span>\n",
       "}\n",
       "</pre></div>\n"
      ],
      "text/plain": [
       "<Response [201]>"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mldb.put('/v1/plugins/pytanic', {\n",
    "    \"type\":\"python\",\n",
    "    \"params\": {\"address\": \"git://github.com/datacratic/mldb-pytanic-plugin\"}\n",
    "})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now you can browse to [the plugin UI](../../../../v1/plugins/pytanic/routes/static/titanic.html).\n",
    "\n",
    "NOTE: this only works if you're running this Notebook live, not if you're looking at a static copy on http://docs.mldb.ai. See the documentation for [Running MLDB](../../../../doc/#builtin/Running.md.html)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "## Where to next?\n",
    "\n",
    "Check out the other [Tutorials and Demos](../../../../doc/#builtin/Demos.md.html)."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
